並列使用多個 JPEG_Encoder_Gray 運算子

簡要說明

檔案:
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\JPEG_Gray_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\JPEG_Color_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCL\Operator_JPEG_Encoder_Gray\Multi\Software
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\JPEG_Gray_CXP_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\JPEG_Color_CXP_Multi.vad
\examples\Processing\Compression\JPEG\mE5-MA-VCX-QP\Operator_JPEG_Encoder_Gray\Software

預設平台:
mE5-MA-VCL
mE5-MA-VCX-QP

短說明

並列使用 JPEG_Encoder_Gray 運算子以提升 JPEG 壓縮的頻寬。

此範例旨在展示如何克服 JPEG_Encoder_Gray 用於 JPEG 壓縮時的頻寬限制。 為了達到此目的,多個運算子將以並列方式運作。針對 marathon mE5 VCL 平台提供了兩個範例。 JPEG_Gray 範例使用四個運算子並列編碼完整配置的灰階影像。 JPEG_Color 範例則使用六個運算子來編碼來自 Bayer 相機的影像,並對色度(Chroma)分量進行水平與垂直方向的降取樣(subsampling)。

灰度 JPEG - VisualApplets 設計

此設計使用四個 JPEG_Encoder_Gray 運算子來編碼頻寬最高達 1200MP/s 的影像(這對於完整配置的 CameraLink 相機來說已足夠)。
JPEG串流基於長度編碼(runlength encoding)。每個串流以 DC 部分開頭,後接數個 AC 分量。 因此,為了將影像分割給多個編碼器,必須在各個間隔重新開始編碼。這可以在 JPEG 格式中使用重新啟動標記(restart marker)來完成。 因此,VisualApplets 設計將影像分割為八行一組的區塊(最小編碼單元(MCU)的一行)。 在每個 MCU 行的結尾會插入一個重新啟動標記。

基本設計結構

圖 276. 基本設計結構


在圖 276 中,您可以看到通用的 Applet。對於壓縮部分,有三個有趣的階層方塊(JPEGBlockSorter8x8、SplitImage 與 SYNC)。 在 JPEGBlockSorter8x8(圖 277)中,八行的資料被重新排列成 8x8 像素的區塊。這些區塊會連續發送。
為了保持影像便於處理,尺寸維持不變。
SplitImage(圖 279)將影像儲存至 DRAM,並重新排列各行,使得四個連續的行對應四個獨立的 MCU 區塊行。 透過這種方式,MCU 區塊行的串流可以被分割並發送至 4 個獨立的編碼器。
SYNC 收集已編碼的串流,將結尾處的資訊標籤替換為重新啟動標記,並將所有行附加到影像中。

JPEGBlockSorter8x8 方塊的內容

圖 277. JPEGBlockSorter8x8 方塊的內容


首先將八個像素附加到一個「區塊像素」中。在排序方塊中,這些「區塊像素」的排列方式使得 每行的區塊像素依序相接,如圖 278 所示。

JPEGBlockSorter8x8 中的像素重新排列

圖 278. JPEGBlockSorter8x8 中的像素重新排列


SplitImage(圖 279)方塊將來自 JPEGBlockSorter8x8(圖 277)的行重新排列為一種方案, 其中總是獨立傳輸四個區塊。每個區塊包含八行。此程序會重複進行,直到 傳輸完所有行。
在 Split 方塊中,影像被分割成四張影像。這是透過移除每個連結中不屬於該影像的所有行來完成的。 這些子影像被分割 為高度為八的影像,以便 Applet 可以在八行的結尾處插入重新啟動間隔。

SplitImage 方塊的內容

圖 279. SplitImage 方塊的內容


SYNC 方塊將每個 JPEG_Converter 的串流組合成單一影像。這透過三個步驟完成。首先,將最後的位元組(0xFFD9 - 影像結尾標記 + 來自運算子的資訊)標記為待移除。 這是在 RemoveFillByte 方塊(圖 280)中完成的。 其次,在區塊之間加入重新啟動標記。JPEG 串流中的重新啟動標記結構為:「0xFFDx」, 其中 x 是從 0 到 7 輪流計算的值。這是在 RestartMarker 方塊(圖 277)中完成的。 第三,移除未使用的位元組。

RemoveFillByte 方塊的內容

圖 280. RemoveFillByte 方塊的內容


RestartMarker 方塊的內容

圖 281. RestartMarker 方塊的內容


對於由此 Applet 產生的影像資料,您需要在標頭中加入重新啟動資訊。 這可以透過在標頭中加入 DRI 標記(0xFF DD)來完成。

彩色 JPEG - VisualApplets 設計

基本設計結構

圖 282. 基本設計結構


此範例與灰階範例基本上相同。不同之處在於:
1. 來自 Bayer 轉換的 RGB 資料會轉換為 YCrCb 色彩空間。
2. 對 Cr 和 Cb 分量進行次取樣。
3. 分離的影像會緩衝在獨立的緩衝區中。為了將行排序到六個轉換器而不插入虛擬行,需要一個獨立的排序緩衝區。
4. 需要將 Sync 分割為三個高度不同的不同影像。

為了在次取樣影像中使用重啟間隔,取樣係數需要調整為通道中 MCU 的最小數量。我們使用 4:2:0 次取樣。 這意味著 Cr 和 Cb 影像中的行寬僅有一半。這就是為什麼 Y 影像中的行也需要對半分割,以便將所有重啟標記放在同一個位置。